package com.boot2523.myrabbitmq.q1;

import com.rabbitmq.client.*;

import java.io.IOException;

public class Consumer {
    private final static String QUEUE_NAME = "simple_queue";

    public static void main(String[] args) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        factory.setPort(5672);
        factory.setUsername("guest");
        factory.setPassword("guest");

        Connection connection = factory.newConnection();
        //接口
        Channel channel = connection.createChannel();

        // 声明队列（确保队列存在）
        //如果队列不存在，则创建；如果存在则不创建
//        QUEUE_NAME String 队列的名称，例如 "task_queue"
//        durable boolean 是否持久化（重启后队列是否还存在）
//        exclusive boolean 是否排他（仅限当前连接使用）
//        autoDelete boolean 是否自动删除（当最后一个消费者取消订阅后删除队列）
//        arguments Map<String, Object> 其他参数，比如设置队列的最大长度、TTL 等
        channel.queueDeclare(QUEUE_NAME, true, false, false, null);

        System.out.println(" [*] 等待接收消息...");

        // 定义消费者回调
//        consumerTag：消费者的标签，是一个字符串标识符。通常由 RabbitMQ 自动生成，用于区分不同的消费者。
//• delivery：一个 Delivery 对象，包含了消息的元数据和内容（body）。
//        getBody() 获取消息体的字节数组（byte[]）
//        getEnvelope() 获取消息的信封（包含 exchange、routing key 等信息）
//        getProperties() 获取消息的属性（如持久化标志、内容类型等）
        DeliverCallback dc = (consumerTag, delivery) -> {
//            将接收到的消息体（字节数组）转换为 UTF-8 编码的字符串；
//• 并打印出收到的消息内容。
            String message = new String(delivery.getBody(), "UTF-8");
            System.out.println(" [x] 收到 '" + message + "'");
        };

        // 开始消费
//        RabbitMQ Java 客户端中用于启动消费者并订阅队列的核心方法。
//        注册一个消费者，持续监听指定的队列，并在有消息到达时触发回调处理。
//        QUEUE_NAME String 要消费的队列名称（必须已存在或之前声明过）
//        autoAck boolean 是否自动确认（acknowledgment）消息
//        deliverCallback DeliverCallback 收到消息时的回调函数（即如何处理消息）
//        cancelCallback Consumer 的取消回调（Runnable 或 Function<String, ?>）消费者被取消时的回调函数
        channel.basicConsume(QUEUE_NAME, true, dc, consumerTag -> {});
    }
}